链表队列很简单,之前看到过,没有用程序实现。其原理就是遵循FIFO原则,只能从队首取元素,从队尾插入元素,就和排队模型一样。因此只需要队首指针和队尾指针就可以方便的进行队列操作。因为在最近看的图论算法中,经常用到队列,在这里就先用程序实现链表队列。
和单链表一样,为了运算方便,我们也在队头节点前附加一个头结点,且头指针指向头结点。其链表队列的示意图如下:
下面是具体的程序实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
| #include<stdio.h> #include<stdlib.h>
typedef struct node//定义节点的结构体 { int data; struct node *next; }linklist;
typedef struct//定义链表 { linklist *front,*rear; }linkqueue;
void SetNull(linkqueue *q) { q->front=(linklist *)malloc(sizeof(linklist)); q->front->next=NULL; q->rear=q->front; }
int Empty(linkqueue *q) { if(q->front==q->rear) return 1; else return 0; }
int Front(linkqueue *q) { if(Empty(q)) { printf("queue is empty!"); return -1; } else return q->front->next->data; }
void ENqueue(linkqueue *q,int x) { linklist * newnode=(linklist *)malloc(sizeof(linklist)); q->rear->next=newnode; q->rear=newnode; q->rear->data=x; q->rear->next=NULL; }
int DEqueue(linkqueue *q) { int temp; linklist *s; if(Empty(q)) { printf("queue is empty!"); return -1; } else { s=q->front->next; if(s->next==NULL) { q->front->next=NULL; q->rear=q->front; } else q->front->next=s->next; temp=s->data; return temp; } }
void main() { linkqueue q; SetNull(&q); ENqueue(&q,2); ENqueue(&q,3); ENqueue(&q,4); DEqueue(&q); DEqueue(&q); int a=0; a=Front(&q);
printf("%d\n",a); }
|